package com.yunxi.module.system.mapper.dict;

import com.yunxi.framework.common.pojo.PageResult;
import com.yunxi.framework.mybatis.core.mapper.BaseMapperX;
import com.yunxi.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.yunxi.module.system.model.dict.DictDataDO;
import com.yunxi.module.system.vo.admin.dict.data.DictDataPageReqVO;
import org.apache.ibatis.annotations.Mapper;

import java.util.Collection;
import java.util.List;

/**
 * <p>
 * 数据字典 mapper
 * </p>
 *
 * @author lidy
 * @since 2024-05-08
 */
@Mapper
public interface DictDataMapper extends BaseMapperX<DictDataDO> {

    /**
     * 根据状态和字典类型查询字典列表
     *
     * @param status   状态
     * @param dictType 字典类型
     * @return 字典列表
     */
    default List<DictDataDO> selectListByStatusAndDictType(Integer status, String dictType) {
        return selectList(new LambdaQueryWrapperX<DictDataDO>()
                .eqIfPresent(DictDataDO::getStatus, status)
                .eqIfPresent(DictDataDO::getDictType, dictType));
    }

    /**
     * 根据字典类型和字典值查询字典数据
     *
     * @param dictType 字典类型
     * @param values   字典值
     * @return 字典集合
     */
    default List<DictDataDO> selectByDictTypeAndValues(String dictType, Collection<String> values) {
        return selectList(new LambdaQueryWrapperX<DictDataDO>()
                .eq(DictDataDO::getDictType, dictType)
                .in(DictDataDO::getValue, values));
    }

    /**
     * 根据字典类型和字典值获得字典信息
     *
     * @param dictType 字典类型
     * @param value    字典值
     * @return 字典信息
     */
    default DictDataDO selectByDictTypeAndValue(String dictType, String value) {
        return selectOne(DictDataDO::getDictType, dictType, DictDataDO::getValue, value);
    }

    /**
     * 解析获得指定的字典数据
     *
     * @param dictType 字典类型
     * @param label    字典标签
     * @return 字典信息
     */
    default DictDataDO selectByDictTypeAndLabel(String dictType, String label) {
        return selectOne(DictDataDO::getDictType, dictType, DictDataDO::getLabel, label);
    }

    /**
     * 获得字典数据分页列表
     *
     * @param reqVO 查询条件
     * @return 字典数据分页列表
     */
    default PageResult<DictDataDO> selectPage(DictDataPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<DictDataDO>()
                .likeIfPresent(DictDataDO::getLabel, reqVO.getLabel())
                .likeIfPresent(DictDataDO::getDictType, reqVO.getDictType())
                .eqIfPresent(DictDataDO::getStatus, reqVO.getStatus())
                .orderByAsc(DictDataDO::getSort));
    }
}
